package mht.practice.sort;

import java.util.Arrays;

/**
 * 不同排序方法之间的性能比较
 * Created by MHT on 2017/8/25.
 */
public class Test {

    public static void main(String[] args) {
        int N = 100000;

        // 测试1 一般测试
        System.out.println("Test for random array, size = " + N + " , random range [0, " + N + "]");

        Integer[] a = SortTestHelper.generateRandomArray(N,0,N);
        Integer[] b = Arrays.copyOf(a,a.length);
        Integer[] c = Arrays.copyOf(a,a.length);
        Integer[] d = Arrays.copyOf(a,a.length);
        Integer[] e = Arrays.copyOf(a,a.length);
        Integer[] f = Arrays.copyOf(a,a.length);
        Integer[] g = Arrays.copyOf(a,a.length);
        Integer[] h = Arrays.copyOf(a,a.length);
        Integer[] i = Arrays.copyOf(a,a.length);
        Integer[] j = Arrays.copyOf(a,a.length);
        Integer[] k = Arrays.copyOf(a,a.length);


        //不同排序方法之间的性能比较
//        SortTestHelper.testSort("mht.practice.sort.SelectionSort",a);
//        SortTestHelper.testSort("mht.practice.sort.InsertionSort",b);
//        SortTestHelper.testSort("mht.practice.sort.InsertionSort2",c);
//        SortTestHelper.testSort("mht.practice.sort.BubbleSort",d);
//        SortTestHelper.testSort("mht.practice.sort.MergeSort",e);
//        SortTestHelper.testSort("mht.practice.sort.MergeSort2",f);
//        SortTestHelper.testSort("mht.practice.sort.MergeSortBU",g);
        SortTestHelper.testSort("mht.practice.sort.QuickSort",h);
        SortTestHelper.testSort("mht.practice.sort.QuickSort2",i);
        SortTestHelper.testSort("mht.practice.sort.QuickSortTwoWays",j);
        SortTestHelper.testSort("mht.practice.sort.QuickSortThreeWays",k);







        // 测试2 测试近乎有序的数组
        int swapTimes = 100;
        assert swapTimes >= 0;
        System.out.println();
        System.out.println("Test for nearly ordered array, size = " + N + " , swap time = " + swapTimes);

        a = SortTestHelper.generateNearlyOrderedArray(N, swapTimes);
        b = Arrays.copyOf(a,a.length);
        c = Arrays.copyOf(a,a.length);
        d = Arrays.copyOf(a,a.length);
        e = Arrays.copyOf(a,a.length);
        f = Arrays.copyOf(a,a.length);
        g = Arrays.copyOf(a,a.length);
        h = Arrays.copyOf(a,a.length);
        i = Arrays.copyOf(a,a.length);
        j = Arrays.copyOf(a,a.length);
        k = Arrays.copyOf(a,a.length);

//        SortTestHelper.testSort("mht.practice.sort.SelectionSort",a);
//        SortTestHelper.testSort("mht.practice.sort.InsertionSort",b);
//        SortTestHelper.testSort("mht.practice.sort.InsertionSort2",c);
//        SortTestHelper.testSort("mht.practice.sort.BubbleSort",d);
//        SortTestHelper.testSort("mht.practice.sort.MergeSort",e);
//        SortTestHelper.testSort("mht.practice.sort.MergeSort2",f);
//        SortTestHelper.testSort("mht.practice.sort.MergeSortBU",g);
        SortTestHelper.testSort("mht.practice.sort.QuickSort",h);
        SortTestHelper.testSort("mht.practice.sort.QuickSort2",i);
        SortTestHelper.testSort("mht.practice.sort.QuickSortTwoWays",j);
        SortTestHelper.testSort("mht.practice.sort.QuickSortThreeWays",k);



        // 测试3 测试存在包含大量相同元素的数组
        System.out.println();
        System.out.println("Test for random array, size = " + N + " , random range [0,10]");

        a = SortTestHelper.generateRandomArray(N, 0, 10);
        b = Arrays.copyOf(a,a.length);
        c = Arrays.copyOf(a,a.length);
        d = Arrays.copyOf(a,a.length);
        e = Arrays.copyOf(a,a.length);
        f = Arrays.copyOf(a,a.length);
        g = Arrays.copyOf(a,a.length);
        h = Arrays.copyOf(a,a.length);
        i = Arrays.copyOf(a,a.length);
        j = Arrays.copyOf(a,a.length);
        k = Arrays.copyOf(a,a.length);

//        SortTestHelper.testSort("mht.practice.sort.SelectionSort",a);
//        SortTestHelper.testSort("mht.practice.sort.InsertionSort",b);
//        SortTestHelper.testSort("mht.practice.sort.InsertionSort2",c);
//        SortTestHelper.testSort("mht.practice.sort.BubbleSort",d);
//        SortTestHelper.testSort("mht.practice.sort.MergeSort",e);
//        SortTestHelper.testSort("mht.practice.sort.MergeSort2",f);
//        SortTestHelper.testSort("mht.practice.sort.MergeSortBU",g);
        SortTestHelper.testSort("mht.practice.sort.QuickSort",h);
        SortTestHelper.testSort("mht.practice.sort.QuickSort2",i);
        SortTestHelper.testSort("mht.practice.sort.QuickSortTwoWays",j);
        SortTestHelper.testSort("mht.practice.sort.QuickSortThreeWays",k);





    }
}
